//
//  com.c
//  博客代码
//
//  Created by 马鹏朔 on 2022/11/7.
//

#include "顺序表的实现.h"
void  SeqListInit(SL* psl, size_t capacity)
{
    assert(psl);// 防止传入空指针
    psl->arr = NULL; //对首地址的初始化
  psl->capicity=psl->size=0;
}

void FindCapicity(SL *psl)
{
    assert(psl);
    if(psl->size==psl->capicity)
    {
        size_t newCapicity =psl->capicity==0?4:psl->capicity*2; //运用了三目操作 判断空间刚开始是否为0 如果为零使空间变为4 否侧扩大两倍
      SLDataType* tmp=  realloc(psl->arr,newCapicity*sizeof(SLDataType)); //空间的扩容
        if(tmp==NULL)
        {
            perror("realloc fail");
            exit(-1);
        }
    }
}
void SeqListDestory (SL*psl)
{
    assert(psl);
    if(psl->arr)
    {
        free(psl->arr);
        psl->arr=NULL;
        psl->size=psl->capicity=0;
    }
}
void SeqListPrint(SL*psl)
{
    assert(psl);
    int i=0;
    for(i=0;i<psl->size;i++)
    {
        printf("%d ",psl->arr[i]);
    }
}
void SeqListPushBack(SL*psl,SLDataType x)
{
    assert(psl);
    //检查容量
    if(psl->size==psl->capicity)
    {
        size_t newCapicity=psl->capicity==0?4:psl->capicity*2;
      SLDataType* tmp=  realloc(psl->arr,newCapicity*sizeof(SLDataType));
        if(tmp==NULL)
        {
            perror("realloc fail");
            exit(-1);
        }
        psl->arr=tmp;
        psl->capicity=newCapicity;
    }
    psl->arr[psl->size]=x;
    psl->size++;
}
void SeqListPopBack(SL*psl)
{
    assert(psl);
    //这是一种设置
    if (psl->size==0)
    {
        return ;
    }
 // 这是另一种设置
    assert(psl->size>0);
    --psl->size; //这里要注意size不能为0 所以前面要设置一下要求
    
}
void SeqListPushFront(SL* psl,SLDataType x)
{
    assert(psl);
    size_t  end =psl->size;
    int begin=1;
    
    while (begin<=psl->size)
    {
        psl->arr[end]= psl->arr[end-1];
        --end;
        begin++;
    }
    psl->arr[0]=x;
    psl->size++;
}
void SeqListPopFront(SL*psl)
{
    assert(psl);
    int begin=1;
    while(begin<psl->size)
    {
        psl->arr[begin-1]=psl->arr[begin];
        ++begin;
    }
    --psl->size;
}
int SeqListFind(SL*psl,SLDataType x)
{
    for(int i=0;i<psl->size;i++)
    {
        if(x==psl->arr[i])
        {
            return i;
        }
    }
    return -1;
}
void  SeqListInsert(SL* psl, size_t pos, SLDataType x)
{
    assert(psl);
    size_t end=psl->size;
    size_t begin=pos;
    while (begin<psl->size)
    {
        psl->arr[end]=psl->arr[end-1];
        --end;
        ++begin;
    }
    psl->arr[pos]=x;
    psl-> size++;
}
void SeqListErase(SL* psl, size_t pos)
{
    assert(psl);
    assert(pos<psl->size);
    size_t begin=pos;
    while(begin<psl->size)
    {
        psl->arr[begin]=psl->arr[begin+1];
        begin++;
    }
    --psl->size;
}

